package main

import (
	"context"
	"crypto/md5"
	"encoding/hex"
	"log"
	pb "main/pb"
	"net"
	"os"

	"google.golang.org/grpc"
	"gopkg.in/yaml.v3"
)

// HelloService 定义我们的服务

type SaltService struct {
	pb.UnimplementedSaltServer
}

//  DoSalt 实现 DoSalt方法

func (s *SaltService) DoSalt(ctx context.Context, req *pb.SaltRequest) (*pb.SaltResp, error) {
	log.Println("DoSalt")
	salt := req.GetSalt()
	str := req.GetStr()
	h := md5.New()
	h.Write([]byte(salt)) // 先传入盐值，之前因为顺序错了卡了很久
	h.Write([]byte(str))
	res := h.Sum(nil)
	return &pb.SaltResp{Message: hex.EncodeToString(res)}, nil
}

// const (
// 	// Address 监听地址
// 	Address string = ":8000"
// 	// Network 网络通信协议
// 	Network string = "tcp"
// )

// ServerConfig 定义了与YAML配置文件对应的结构体
type ServerConfig struct {
	Server struct {
		Address string `yaml:"address"`
		Network string `yaml:"network"`
	} `yaml:"server"`
}

func main() {
	log.SetFlags(log.Lshortfile | log.LstdFlags)
	log.Println("gRPC server start")

	configFile, err := os.ReadFile("./manifest/config.yaml")
	if err != nil {
		log.Fatalf("error: %v", err)
	}

	var config ServerConfig
	err = yaml.Unmarshal(configFile, &config)
	if err != nil {
		log.Fatalf("Unmarshal: %v", err)
	}
	// 监听本地端口
	listener, err := net.Listen("tcp", config.Server.Address)
	if err != nil {
		log.Panicf("net.Listen err: %v", err)
	}
	log.Println(config.Server.Address + " net.Listing...")
	// 新建gRPC服务器实例
	grpcServer := grpc.NewServer()
	// 在gRPC服务器注册我们的服务
	// A := pb.HelloServI
	// pb.RegisterHelloServer(grpcServer, &HelloService{})
	pb.RegisterSaltServer(grpcServer, &SaltService{})
	//用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待，直到进程被杀死或者 Stop() 被调用
	err = grpcServer.Serve(listener)
	if err != nil {
		log.Panicf("grpcServer.Serve err: %v", err)
	}
}
